#Boa:Dialog:reimpresion

import wx
import utiles
import consultasBD
import ImpresionFiscal
import Dialog2
from decimal import Decimal

def create(parent):
    return reimpresion(parent)

[wxID_REIMPRESION, wxID_REIMPRESIONBUTTON1, wxID_REIMPRESIONBUTTON2, 
 wxID_REIMPRESIONFACTURA, wxID_REIMPRESIONNRODOCUMENTO, 
 wxID_REIMPRESIONRECIBO, wxID_REIMPRESIONSTATICTEXT1, 
] = [wx.NewId() for _init_ctrls in range(7)]

class reimpresion(wx.Dialog):
    def _init_ctrls(self, prnt):
        # generated method, don't edit
        wx.Dialog.__init__(self, id=wxID_REIMPRESION, name='reimpresion',
              parent=prnt, pos=wx.Point(356, 158), size=wx.Size(241, 194),
              style=wx.DEFAULT_DIALOG_STYLE, title='Reimpresiones')
        self.SetClientSize(wx.Size(233, 162))

        self.staticText1 = wx.StaticText(id=wxID_REIMPRESIONSTATICTEXT1,
              label='Nro. documento', name='staticText1', parent=self,
              pos=wx.Point(24, 24), size=wx.Size(77, 13), style=0)

        self.nrodocumento = wx.TextCtrl(id=wxID_REIMPRESIONNRODOCUMENTO,
              name='nrodocumento', parent=self, pos=wx.Point(104, 24),
              size=wx.Size(100, 21), style=0, value='')

        self.button1 = wx.Button(id=wxID_REIMPRESIONBUTTON1, label='Aceptar',
              name='button1', parent=self, pos=wx.Point(24, 120),
              size=wx.Size(75, 23), style=0)
        self.button1.Bind(wx.EVT_BUTTON, self.OnAceptar,
              id=wxID_REIMPRESIONBUTTON1)

        self.button2 = wx.Button(id=wxID_REIMPRESIONBUTTON2, label='Cancelar',
              name='button2', parent=self, pos=wx.Point(128, 120),
              size=wx.Size(75, 23), style=0)
        self.button2.Bind(wx.EVT_BUTTON, self.OnCancelar,
              id=wxID_REIMPRESIONBUTTON2)

        self.factura = wx.RadioButton(id=wxID_REIMPRESIONFACTURA,
              label='Factura', name='factura', parent=self, pos=wx.Point(104,
              64), size=wx.Size(81, 13), style=0)
        self.factura.SetValue(True)

        self.recibo = wx.RadioButton(id=wxID_REIMPRESIONRECIBO, label='Recibo',
              name='recibo', parent=self, pos=wx.Point(104, 85),
              size=wx.Size(81, 13), style=0)
        self.recibo.SetValue(True)

    def __init__(self, parent):
        self._init_ctrls(parent)
        self.factura.SetValue(True)
        self.recibo.SetValue(False)

    def OnAceptar(self, event):
        if self.factura.GetValue():
            if self.nrodocumento.GetValue() == "*":
                self.mostrarDocumentosRecientes()
            else:
                self.reimprimirFactura(self.nrodocumento.GetValue())
        else:
            if self.nrodocumento.GetValue() == "*":
                self.mostrarDocumentosRecientes()
            else:
                self.reimprimirRecibo(self.nrodocumento.GetValue())

    def OnCancelar(self, event):
        self.Close()

    def mostrarDocumentosRecientes(self):
        from datetime import datetime
        import VerDocumentos
        fecha = datetime.today()
        sucursal = utiles.getSucursalActiva()
        sql = "SELECT diasdevoluciones FROM parametros WHERE sucursal = '%s'" % (sucursal)
        resultados = consultasBD.ordenCrudaDict(sql)
        diasdevoluciones = resultados[0]["diasdevoluciones"]*-1
        fecha = str(utiles.sumarDiasAFecha(fecha,diasdevoluciones))[:10]
        tipo = 0
        if self.factura.GetValue():
            tipo = 1 #factura
            consultaSQL = "SELECT count(*) FROM ventas WHERE fecha >= '%s' AND sucursal = '%s' ORDER BY fecha DESC,idventa ASC" % (fecha,sucursal)
            cantidad = consultasBD.ordenCrudaDict(consultaSQL)[0]['count(*)']
        else:
            tipo = 2 #recibo
            consultaSQL = "SELECT count(*) FROM ventas WHERE fecha >= '%s' AND sucursal = '%s' ORDER BY fecha DESC,idventa ASC" % (fecha,sucursal)
            cantidad = consultasBD.ordenCrudaDict(consultaSQL)[0]['count(*)']
        if cantidad == 0:
            utiles.mensaje(None,"Error al consultar la BD.\nNo pudo recuperarse informacion de tickets")
            return
        dlg = VerDocumentos.VerDocumentos(self,fecha,tipo)
        try:
            dlg.ShowModal()
            if dlg.getAceptado():
                if tipo == 1:
                    documentos = dlg.getSeleccion()
                    if len(documentos) > 1:
                        texto = "ATENCION\nESTA POR REIMPRIMIR "+str(len(documentos))+" DOCUMENTOS\n\n"
                        texto+= "Esta seguro de proceder?\n\n"
                        texto+= "(Aceptar = Si / Cancelar = No)"
                        confirma = Dialog2.Dialog2(self, texto)
                        try:
                            confirma.ShowModal()
                            if confirma.getSeleccion():
                                for documento in documentos:
                                    self.reimprimirFactura(documento)
                        finally:
                            confirma.Destroy()
                    else:
                        for documento in documentos:
                            self.reimprimirFactura(documento)
                else: #tipo = 2
                    documentos = dlg.getSeleccion()
                    if len(documentos) > 1:
                        texto = "ATENCION\nESTA POR REIMPRIMIR "+str(len(documentos))+" DOCUMENTOS\n\n"
                        texto+= "Esta seguro de proceder?\n\n"
                        texto+= "(Aceptar = Si / Cancelar = No)"
                        confirma = Dialog2.Dialog2(self, texto)
                        try:
                            confirma.ShowModal()
                            if confirma.getSeleccion():
                                for documento in documentos:
                                    self.reimprimirRecibo(documento)
                        finally:
                            confirma.Destroy()
                    else:
                        for documento in documentos:
                            self.reimprimirRecibo(documento)
        finally:
            dlg.Destroy()

    def ajustarCadena(self, cadena, longitud=40):
        if len(cadena) < longitud:
            aux1 = cadena.split()
            aux2 = ""
            for aux in aux1[:len(aux1)-1]:
                aux2 += aux+" "
            l1 = len(aux2)
            l2 = len(aux1[-1:][0])
            l = l1 + l2
            for x in range(longitud-l):
                aux2 += " "
            cadena = aux2 + str(aux1[-1:][0])
        return cadena

    def reimprimirFactura(self,nrodocumento):
        reimpresionFactura = []
        reimpresionFactura.append("REIMPRESION DE COMPROBANTE")
        reimpresionFactura.append(" ")

        #busco la factura
        print "Nro documento: ",nrodocumento
        consultaSQL = "SELECT * FROM ventas WHERE nrofactura = '%s'" % (str(nrodocumento))
        datosFactura = consultasBD.ordenCrudaDict(consultaSQL)
        if len(datosFactura) != 1:
            utiles.mensaje(None,"Error al consultar la BD.\nNo pudo recuperarse el comprobante indicado")
            return
        datosFactura = datosFactura[0]

        #busco el cliente
        consultaSQL = "SELECT * FROM cliente WHERE idcliente = '%s'" % (str(datosFactura['idcliente']))
        datosCliente = consultasBD.ordenCrudaDict(consultaSQL)
        if len(datosCliente) != 1:
            utiles.mensaje(None,"Error al consultar la BD.\nNo pudo recuperarse informacion del cliente")
            return
        datosCliente = datosCliente[0]

        linea1 = ""
        linea2 = ""

        if datosFactura['idformaticket'] == 1:
            if (datosCliente['situacionfiscal'] == "Inscripto"):
                iva = "(21.00)"
                linea1 = "TICKET A  "
            else:
                iva = "(0.00)"
                linea1 = "TICKET B  "
            linea2 = "          "

        reimpresionFactura.append("-"*40)
        reimpresionFactura.append(linea1+"Doc. nro.: %s" % (str(datosFactura['nrofactura'])))
        fecha = str(datosFactura['fecha'])
        fecha = fecha[8:10]+"-"+fecha[5:7]+"-"+fecha[:4]
        reimpresionFactura.append(linea2+"Fecha: %s" % (str(fecha)))

        reimpresionFactura.append("-"*40)
        reimpresionFactura.append("Nombre: " + str(datosCliente['nombre']))
        reimpresionFactura.append("DOC.: " + str(datosCliente['tipodoc'])+" "+str(datosCliente['nrodoc']))
        reimpresionFactura.append("A "+str(datosCliente['situacionfiscal']))
        reimpresionFactura.append("Direccion: " + str(datosCliente['direccion']))
        reimpresionFactura.append("-"*40)

        if (datosCliente['situacionfiscal'] == "Inscripto"):
            iva = "(21.00)"
        else:
            iva = "(0.00)"

        #busco los items de la factura
        consultaSQL = "SELECT * FROM ventastieneproductos WHERE nrofactura = '%s' AND idticket = '%s'" % (str(datosFactura['nrofactura']),str(datosFactura['idventa']))
        datosItems = consultasBD.ordenCrudaDict(consultaSQL)
        if len(datosItems) == 0:
            utiles.mensaje(None,"Error al consultar la BD.\nNo pudo recuperarse informacion de los items")
            return

        #calculo de descuentos por item o globales que se hayan realizado
        #descuento contiene una lista de descuentos realizados por item, en valores unitarios
        descuentos = {}
        totalFactura = Decimal("0.00")

        for item in datosItems:
            cadena = str(item['cantidad'])+" / "+str(item['preciolista'])+" "+iva
            reimpresionFactura.append(self.ajustarCadena(cadena,25))
            reimpresionFactura.append(str(item['descri']))
            reimpresionFactura.append("PTC: "+str(item['ptc']))
            cadena = "Color: "+str(item['color']+" Talle: "+str(item['talle']))+" $"+str("%.02f" % (Decimal(str(item['preciolista']))*Decimal(str(item['cantidad']))))
            reimpresionFactura.append(self.ajustarCadena(cadena))
            if item['descuento'] != 0:
                precioUnitario = Decimal(str(item['preciofinal'])) / Decimal(str(item['cantidad']))
                valor = Decimal(str(item['preciolista'])) - precioUnitario
                if valor != Decimal("0.00"):
                    reimpresionFactura.append("Descuento sobre ultima venta")
                    cadena = str(item['cantidad'])+" / "+str(Decimal("-1")*valor)+" "+iva
                    reimpresionFactura.append(self.ajustarCadena(cadena,25))
                    cadena = "Bonificacion $"+str("%.02f" % Decimal(str(Decimal("-1")*Decimal(str(item['cantidad']))*Decimal(valor))))
                    reimpresionFactura.append(self.ajustarCadena(cadena))
                    descuentos[item['ptc']] = valor
            totalFactura += Decimal(str(item['preciofinal']))

        descuentoGlobal = Decimal("0.00")
        if len(descuentos) == 0:
            #no hubo descuentos por item, pero todavia puede haber descuento global en la factura
            descuentoGlobal = totalFactura - Decimal(str(datosFactura['totalfactura']))
            if descuentoGlobal != Decimal("0.00"):
                cadena = "Descuento/Recargo $"+str("%.02f" % (Decimal("-1")*descuentoGlobal))
                reimpresionFactura.append(self.ajustarCadena(cadena))
        totalFactura -= descuentoGlobal

        netoSinIva = Decimal("%.02f" % (totalFactura / Decimal("1.21") ))
        ivacalculado = Decimal("%.02f" % (totalFactura - netoSinIva))

        if (datosCliente['situacionfiscal'] == "Inscripto"):
            reimpresionFactura.append(" ")
            cadena = "NETO SIN IVA $" + str("%.02f" % netoSinIva)
            reimpresionFactura.append(self.ajustarCadena(cadena))
            cadena = "IVA "+iva+"%"+" $"+str(ivacalculado)
            reimpresionFactura.append(self.ajustarCadena(cadena))
            cadena = "CONCEPTOS NO GRAVADOS $0.00"
            reimpresionFactura.append(self.ajustarCadena(cadena))

        reimpresionFactura.append(" ")
        cadena = "TOTAL $"+str("%.02f" % Decimal(str(totalFactura)))
        reimpresionFactura.append(self.ajustarCadena(cadena))
        reimpresionFactura.append(" ")

        reimpresionDetalle = ["DETALLE DE CUOTAS"]
        if totalFactura > 0:
            reimpresionFactura.append("RECIBIMOS :")
            #buscamos informacion sobre como fue pagado el ticket
            consultaSQL = "SELECT * FROM ventastienepagos WHERE nrofactura = '%s' AND idventa = '%s'" % (str(datosFactura['nrofactura']),str(datosFactura['idventa']))
            datosPagosEfectivo = consultasBD.ordenCrudaDict(consultaSQL)
            consultaSQL = "SELECT * FROM vtas_ctasctes WHERE nrofactura = '%s' AND idventa = '%s' ORDER BY idformapagos,cuota" % (str(datosFactura['nrofactura']),str(datosFactura['idventa']))
            datosPagosCtasCtes = consultasBD.ordenCrudaDict(consultaSQL)

            if len(datosPagosEfectivo) == 0 and len(datosPagosCtasCtes) == 0:
                utiles.mensaje(None,"Error al consultar la BD.\nNo pudo recuperarse informacion de los pagos")
                return
            
            for valor in datosPagosEfectivo:
                cadena = valor['descrivalor'] + " $"+str("%.02f" % valor['monto'])
                reimpresionFactura.append(self.ajustarCadena(cadena))
            
            x = 0
            reimpresionDetalle = ["DETALLE DE CUOTAS"]
            while x < len(datosPagosCtasCtes):
                subtotal = Decimal("0.00")
                descripcion = datosPagosCtasCtes[x]['descripcion']
                reimpresionDetalle.append(descripcion)
                idformapago_actual = datosPagosCtasCtes[x]['idformapagos']
                idformapago_anterior = idformapago_actual
                while True:
                    if (idformapago_actual != idformapago_anterior):
                        break
                    subtotal += Decimal(str(datosPagosCtasCtes[x]['montocuota']))
                    fecha = str(datosPagosCtasCtes[x]['vencimiento'])
                    fecha = fecha[8:10]+"-"+fecha[5:7]+"-"+fecha[:4]
                    reimpresionDetalle.append("Venc: "+fecha+" $"+str(datosPagosCtasCtes[x]['montocuota']))
                    x += 1
                    if (not x < len(datosPagosCtasCtes)):
                        break
                    idformapago_actual = datosPagosCtasCtes[x]['idformapagos']
                cadena = descripcion + " $" + str("%.02f" % subtotal)
                reimpresionFactura.append(self.ajustarCadena(cadena))

        consultaSQL = "SELECT nombre FROM vendedoras WHERE idvendedora = '%s'" % (datosFactura['usuario'])
        nombreVendedora = consultasBD.ordenCrudaDict(consultaSQL)[0]['nombre']

        reimpresionFactura.append(" ")
        reimpresionFactura.append("Vendedora: "+nombreVendedora)
        reimpresionFactura.append("Codg. cliente: "+str(datosCliente['idcliente']))
        reimpresionFactura.append(" ")
        reimpresionFactura.append("MUCHAS GRACIAS POR SU COMPRA")

        print "*"*40
        for renglon in reimpresionFactura:
            print renglon
        print "*"*40
        if reimpresionDetalle != ["DETALLE DE CUOTAS"]:
            for renglon in reimpresionDetalle:
                print renglon
            print "*"*40

        if datosFactura['idformaticket'] != 2:
            print
            print "REIMPRIMIENDO TICKET EN IMPRESORA FISCAL"
            try:
                ImpresionFiscal.imprimirDetalle(reimpresionFactura)
                if reimpresionDetalle != ["DETALLE DE CUOTAS"]:
                    ImpresionFiscal.imprimirDetalle(reimpresionDetalle)
            except ImpresionFiscal.PrintError:
                utiles.logOperaciones("ERROR: en impresion ticket")
                utiles.mensaje(self, "No ha podido reimprimirse el ticket\nProblemas con la impresora fiscal?")
                self.Close()
            except Exception, e:
                utiles.logOperaciones("ERROR: en impresion ticket")
                print e.__str__()
    
        self.Close()

    def reimprimirRecibo(self, nrodocumento):
        reimpresionRecibo = []
        reimpresionRecibo.append("REIMPRESION DE COMPROBANTE")
        reimpresionRecibo.append(" ")
        
        #busco el recibo
        consultaSQL = "SELECT * FROM ventastienepagos WHERE nrorecibo = '%s'" % (str(nrodocumento))
        datosPagosEfectivo = consultasBD.ordenCrudaDict(consultaSQL)
        consultaSQL = "SELECT * FROM vtas_valores WHERE idrecibo = '%s'" % (str(nrodocumento))
        datosPagosCtasCtes = consultasBD.ordenCrudaDict(consultaSQL)

##        #busco el cliente, debere extraerlo de datosPagosEfectivo o datosPagosCtasCtes
##        consultaSQL = "SELECT * FROM cliente WHERE idcliente = '%s'" % (            )
##        datosCliente = consultasBD.ordenCrudaDict(consultaSQL)
##        if len(datosCliente) != 1:
##            utiles.mensaje(None,"Error al consultar la BD.\nNo pudo recuperarse informacion del cliente")
##            return
##        datosCliente = datosCliente[0]        
        
        print "*"*40
        for renglon in reimpresionRecibo:
            print renglon
        print "*"*40

        self.Close()

